package gat.common.util;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.bitsun.core.common.persistence.Pager;

import java.util.List;
import java.util.Optional;
import java.util.function.BiConsumer;
import java.util.function.Function;

/**
 * 分页工具类
 *
 * @author zengjiawei
 * @date 2021/5/11
 */
public class PageUtils {

    /**
     * IPage<T>对象转成Pager<T>对象
     */
    public static <T> Pager<T> coverToPager(IPage<T> iPage) {
        return new Pager<>(iPage.getRecords(), iPage.getTotal(), iPage.getSize(), iPage.getCurrent());
    }

    /**
     * 手动分页，传入所有数据，截取需要返回的数据
     * @param pageNo
     * @param pageSize
     * @param list
     * @param <T>
     * @return
     */
    public static <T> Pager<T> manualPaging(Integer pageNo, Integer pageSize, List<T> list) {
        Pager<T> result = new Pager<>();
        if (pageSize > 0) {
            result.setCurrentPage(pageNo);
            result.setPageSize(pageSize);
            result.setTotalPage((list.size() % pageSize == 0 ? list.size() / pageSize
                    : list.size() / pageSize + 1));
        }
        result.setTotalCount(list.size());
        //开始截取位置
        int startIndex = (pageNo - 1) * pageSize;
        //结束位置
        int endIndex = startIndex + pageSize;
        if (startIndex > list.size()) {
            return result;
        }
        List<T> newList = list.subList(startIndex, endIndex > list.size() ? list.size() : endIndex);
        result.setList(newList);
        return result;
    }

    /**
     * 重新分页authing数据
     *
     * @param pageNo
     * @param pageSize
     * @param list
     * @param <T>
     * @return
     */
    public static <T> Pager<T> authingPaging(Integer pageNo, Integer pageSize, Integer total, List<T> list) {
        Pager<T> pager = new Pager<>();
        pager.setRecords(list);
        pager.setTotal(total);
        pager.setSize(pageSize);
        pager.setCurrent(pageNo);
        if (pageSize > 0) {
            pager.setCurrentPage(pageNo);
            pager.setPageSize(pageSize);
            pager.setTotalPage((list.size() % pageSize == 0 ? list.size() / pageSize
                    : list.size() / pageSize + 1));
        }
        pager.setList(list);
        return pager;
    }


    public static <T> void setDefaultQueryParam(T t, Function<T, String> function, String defaultParam, BiConsumer<T, String> tConsumer) {
        String param = Optional.ofNullable(function.apply(t))
                .filter(StringUtils::isNotBlank)
                .orElse(defaultParam);
        tConsumer.accept(t, param);
    }
}
